﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using bibliotecaObservador;
using SIGEB.Prototipo.Control;
using SIGEB.Modelo.moduloUsuarios;
using SIGEB.Modelo.moduloMultas;
using SIGEB.Prototipo.Vista.moduloUsuarios;
using SIGEB.Modelo.moduloPerfiles;
using SIGEB.Modelo;

namespace SIGEB.Prototipo.Vista.moduloMultas
{
    public partial class frm_Multas : frm_ModuloBase
    {

        #region "constructores"


        public frm_Multas(): base()
        {
            InitializeComponent();
        }

        public frm_Multas(controlPrincipal cp):base(cp)
        {
            InitializeComponent();
            asignarUI(this.Controls);
        }

        #endregion

        #region "eventos"

        public override void hacerVisible(object[] arg)
        {
            cargarDatosUsuarios();
            if (arg != null && arg[0] != null)
            {
                try
                {
                    string nuevoCodUsuario = (string)arg[0];
                    actualizarUsuarioActual(nuevoCodUsuario);
                }
                catch { }

            }
            actualizarControles();
        }

        private void actualizarControles()
        {
            actualizarBotones();
        }

        private void actualizarBotones()
        {
            btn_pagarMulta.Enabled = multaActual != null;
            btn_pagarMulta.Visible = cp.usuarioActualPuede(acciones.MULTAS_PROCESAR);
        }

        public override void actualizar(object referencia, EventoActualizacion e)
        {
            int num = (int)referencia;
            if (num == conjuntoBase.CONJMULTA)
            {
                llenarActualizarMultas();
                actualizarControles();
            }
        }

        #endregion

        #region "metodos"

        private void actualizarUsuarioActual(string idNuevo)
        {
            userActual = null;
            if (usuariosActuales != null && !string.IsNullOrEmpty(idNuevo))
            {
                foreach (usuario act in usuariosActuales)
                {
                    if (act.idUsuario == idNuevo)
                    {
                        userActual = act;
                        txt_usuario.Text = act.idUsuario;
                        break;
                    }
                }
            }
            llenarActualizarMultas();
        }

        private void llenarActualizarMultas()
        {
            llenarColumnasDgv();
            if (userActual != null)
            {
                multasActuales = cp.ctrlMultas.obtenerMultasUsuario(userActual.idUsuario);
                if (multasActuales != null)
                {
                    foreach (multa act in multasActuales)
                    {
                        dgv_busqueda.Rows.Add(act.monto, cp.ctrlMultas.documentoByEjemplar(act.ejemplar).titulo, act.ejemplar);
                    }
                }
            }
        }

        private void llenarColumnasDgv()
        {
            dgv_busqueda.Columns.Clear();
            dgv_busqueda.Columns.Add("Monto", "Monto");
            dgv_busqueda.Columns.Add("Documento", "Documento");
            dgv_busqueda.Columns.Add("Adquisicion", "Número de adquisición");
        }

        private void cargarDatosUsuarios()
        {
            usuariosActuales = cp.ctrlMultas.obtenerUsuarios();
        }


        private void pagarMulta()
        {
            if (multaActual != null)
            {
                try
                {
                    cp.ctrlMultas.procesarMulta(multaActual.ejemplar, multaActual.usuario);
                }
                catch (Exception e)
                {
                    mostrarInfo(e.Message);
                }
            }
        }

        private multa getMultaSelected()
        {
            try
            {
                dgv_busqueda.Rows[dgv_busqueda.SelectedCells[0].RowIndex].Selected = true;
                String user = txt_usuario.Text;
                String adq = dgv_busqueda.SelectedRows[0].Cells[2].Value.ToString();
                return controlMultas.buscarMultas(multasActuales, user, adq);
            }
            catch
            {
                return null;
            }
        }

        private void actualizarMultaActual()
        {
            multaActual = getMultaSelected();
            actualizarControles();
        }

        #endregion

        #region "atributos"

        LinkedList<usuario> usuariosActuales;
        usuario userActual;

        LinkedList<multa> multasActuales;
        multa multaActual;

        #endregion

        private void btn_usuario_Click(object sender, EventArgs e)
        {
            objetoReturn r = new objetoReturn();
            new busquedaUsuario(usuariosActuales, r).ShowDialog();
            if (!string.IsNullOrEmpty(r.objeto))
            {
                actualizarUsuarioActual(r.objeto);
            }
        }

        private void dgv_busqueda_SelectionChanged(object sender, EventArgs e)
        {
            actualizarMultaActual();
        }

        private void btn_pagarMulta_Click(object sender, EventArgs e)
        {
            pagarMulta();
        }

    }
}
